Méthode de Monte-Carlo¶

Loi des grands nombres¶

On considère une expérience aléatoire d'univers $\Omega$ et $P$ une probabilité sur $\Omega$.


Loi des grands Nombres

Soit $A$ un événement. On répète un très grand nombre de fois et de manière indépendante l'expérience aléatoire et on note $f$ la fréquence à laquelle $A$ est réalisé (c'est-à-dire la fréquence à laquelle l'issue de l'expérience est dans $A$). Quand le nombre d'expériences indépendantes tend vers $+\infty$ (c'est-à-dire devient de plus en plus grand) la fréquence $f$ tend vers $P(A)$.

Méthode de Monte-Carlo¶

Le terme méthode de Monte-Carlo désigne une famille de méthodes algorithmiques visant à calculer une valeur numérique approchée en utilisant des techniques probabilistes. Elles sont particulièrement utilisées pour calculer des surfaces.


Principe de la méthode de Monte-Carlo

On considère une fonction $f: [a,b]\rightarrow\mathbb{R}$ et on souhaite déterminer numériquement une valeur approchée de l'aire $\mathcal{A}_f$ de la partie située sous la courbe représentative de $f$. Pour cela, on considère un rectangle de côté $[a,b]\times [0,M]$ contenant toute la portion de courbe comme sur la figure ci-dessous :

alt text

On tire successivement et de manière indépendante des points au hasard dans ce rectangle et on note $A$ l'événement "le point tiré est sous la courbe". Sous l'hypothèse que $P(A)$ est proportionnelle à $\mathcal{A}_f$, d'après la loi des grands nombres, la fréquence à laquelle $A$ est réalisé va s'approcher de plus en plus de $\frac{\mathcal{A}_f}{\mathcal{A}_{\text{rectangle}}}$.

Programmation Python¶

In [3]:
from IPython.display import HTML
import numpy as np
from random import *
from pylab import *
from matplotlib import animation
from matplotlib import pyplot as plt


# nombre de tirs
NbPt=500

# caractéristique du graphe


fig, (ax1, ax2) = plt.subplots(1, 2,figsize=(10, 6))    # figure sur deux graphes
ax1.set_xlim(0, 1)                                      # axe abscisses graphe 1
ax1.set_ylim(0,1)
ax2.set_xlim(0, NbPt)
ax2.set_ylim(0,1)
Xautre,Yautre,Xcourbe,Ycourbe=[],[],[],[]
S=0
Pi=[]
P=[1/3 for k in range(NbPt)]

pointCourbe, = ax1.plot([],[],'bx')  # go signifie g : green et x: croix ; sur le graphe 1
pointAutre, = ax1.plot([],[],'go')   # ro signifie r : red et o: petit cercle

courbe, =ax2.plot([],[]) 

def init():
    X=linspace(0, 1, 60)
    Y=[k**2 for k in X]
    ax1.plot(X,Y,'r' )
   # ax1.add_artist([X,Y])
    pointCourbe.set_data([],[])
    pointAutre.set_data([],[])
    courbe.set_data([],[])
    ax2.plot(range(NbPt),P)
    return 

def cv2(n):
    global S
    x,y=random(),random()
    if y<=x**2:
        S=S+1
        Xcourbe.append(x)
        Ycourbe.append(y)
        pointCourbe.set_data([Xcourbe, Ycourbe])
    else:
        Xautre.append(x)
        Yautre.append(y)
        pointAutre.set_data([Xautre, Yautre])
    Pi.append(S/(n+1))
    courbe.set_data(range(n+1),Pi)
    return 

anim=animation.FuncAnimation(fig,func=cv2 ,frames= NbPt,init_func=init, interval=20, repeat=False)
plt.close()
HTML(anim.to_jshtml())
Out[3]:


Once Loop Reflect